package com.eian.boot.crypto.model;

import com.eian.boot.crypto.constant.CryptoConstants;
import com.eian.boot.crypto.enums.CryptoAlgorithm;
import lombok.Builder;
import lombok.Data;

/**
 * 加密上下文
 *
 * @author eian
 */
@Data
@Builder
public class CryptoContext {

    /**
     * 加密算法
     */
    private CryptoAlgorithm algorithm;

    /**
     * 密钥（对称加密使用）
     */
    private String key;

    /**
     * 公钥（非对称加密使用）
     */
    private String publicKey;

    /**
     * 私钥（非对称加密使用）
     */
    private String privateKey;

    /**
     * 初始化向量（IV）- 用于 CBC、GCM 模式
     */
    private String iv;

    /**
     * 附加认证数据（AAD）- 用于 GCM 模式
     */
    private String aad;

    /**
     * 字符编码
     */
    @Builder.Default
    private String charset = CryptoConstants.Charset.UTF_8;

    /**
     * 输出格式（Base64/Hex）
     */
    @Builder.Default
    private OutputFormat outputFormat = OutputFormat.BASE64;

    /**
     * 是否存储密钥（默认不存储）
     */
    @Builder.Default
    private boolean storeKey = false;

    /**
     * 密钥标识符（存储时使用）
     */
    private String keyId;

    /**
     * 是否使用国密算法
     */
    public boolean isGM() {
        return algorithm != null && algorithm.isGM();
    }
}

